package com.innotek.testworkstation.common.restassured;

import com.innotek.testworkstation.common.restassured.apipage.ApisStart;
import com.innotek.testworkstation.config.Constant;
import com.innotek.testworkstation.util.CachePool;
import com.innotek.testworkstation.util.StringUtils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import com.innotek.testworkstation.common.restassured.testcase.TestCaseModel;
import com.innotek.testworkstation.util.FileUtil;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static org.junit.jupiter.params.provider.Arguments.arguments;

/**
 * 管理测试用例的运行
 */
public class ApiDDTest {

    private static ApisStart apisStart;

    @BeforeAll
    static void beforeAll() throws IOException {
        // 请求前的前置操作，比如插入token
        ApiBefore.getInstance().runBefore();
    }

    @AfterAll
    static void afterAll() {
        // 所有用例执行完后的清理操作
        // POS机退出
        ApiAfter.getInstance().runAfter();
        // 最后再清空临时数据
        CachePool.getInstance().clearAllItems();

    }

    @ParameterizedTest(name = "{index} {1}")
    @MethodSource
    void apiTest(TestCaseModel testCaseModel, String name) {
        testCaseModel.start(apisStart);
    }

    static List<Arguments> apiTest() {

        //加载所有的api
        apisStart = new ApisStart();

        if(StringUtils.isEmpty(System.getProperty("apiPath"))){
            // 参数为空则执行固定路径下的
            apisStart.loadAllApi("src/main/resources/restassured/pageapi");
        }else{
            // 指定api目录
            apisStart.loadAllApi(System.getProperty("apiPath"));
        }

        String runTag = "all";
        if(StringUtils.isEmpty(System.getProperty("runTag"))){
            System.out.println("22222222:"+System.getProperty("runTag"));
            // 为空则执行所有用例
            runTag = "车牌账户的入和出用例,代缴卡充值用例,欠费记录POS代缴卡支付用例,停车记录查询用例";
        }else{
            // 指定执行的tag的用例
            runTag = System.getProperty("runTag");
        }


        //用来传递给参数化用例
        List<Arguments> testcases = new ArrayList<>();

        //读取所有的测试用例
        String testcaseDir = "";
        if(StringUtils.isEmpty(System.getProperty("casePath"))){
            // 若参数为空，则读取默认路径
            testcaseDir="src/main/resources/restassured/testcase";
        }else{
            // 指定case目录
            testcaseDir=System.getProperty("casePath");
        }

        // 获取目录下的所有文件，一般都是yaml格式
        List<String> fileList = FileUtil.getAllFile(testcaseDir);
        if(fileList.size() > 0){
            String[] runTags = runTag.trim().split(",");
            for(String finalRunTag:runTags){
                fileList.forEach(file ->{
                    try {
                        TestCaseModel apiTestCase = TestCaseModel.loadCase(file);
                        String tagStr = apiTestCase.tag;
                        String[] tags = tagStr.split(",");
                        if(Arrays.asList(tags).contains(finalRunTag)){
                            // 判断tag，只执行某个tag的用例
                            testcases.add(arguments(apiTestCase, apiTestCase.name));
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                });
            }


        }
        if(testcases.isEmpty()){
            throw new NullPointerException("错误，测试用例获取为空,请检查目录和tag！");
        }
        return testcases;
    }
}
